1775F - Laboratory on Pluto - CodeForces Solution


constructive algorithms dp greedy math *2500

Please click on ads to support us..

C++ Code:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
using LL = long long;
const int maxn = 1005, INF = 0x3f3f3f3f;
LL g[maxn], f[5][maxn];
int mod;

void init(){
    g[0] = 1;
    for(int i = 1; i < maxn; i++)
        for(int j = i; j < maxn; j++)
            g[j] = (g[j] + g[j - i]) % mod;
    f[0][0] = 1;
    for(int i = 1; i <= 4; i++){
        for(int j = 0; j < maxn; j++)
            for(int k = 0; j + k < maxn; k++)
                f[i][j + k] = (f[i][j + k] + f[i - 1][j] * g[k]) % mod;
    }
}

int main(){

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    int T, op;
    cin >> T >> op;
    if (op == 1){
        while(T--){
            int n;
            cin >> n;
            int ans = INF, h;
            for(int i = 1; i <= n; i++){
                int j = (n + i - 1) / i;
                if (i + j < ans){
                    ans = i + j;
                    h = i;
                }
            }
            vector<string> s(h);
            int w = (n + h - 1) / h;
            for(int i = 0, k = 0; i < h; i++){
                s[i].resize(w);
                for(int j = 0; j < w; j++){
                    if (++k > n) s[i][j] = '.';
                    else s[i][j] = '#';
                }
            }
            cout << h << ' ' << w << '\n';
            for(auto &x : s) cout << x << '\n';
        }
    }
    else{
        cin >> mod;
        init();
        while(T--){
            int n;
            cin >> n;
            int ans = INF;
            vector<int> cand;
            for(int i = 1; i <= n; i++){
                int j = (n + i - 1) / i;
                if (i > j) break;
                if (i + j < ans){
                    ans = i + j;
                    cand = {i};
                }
                else if (i + j == ans) cand.push_back(i);
            }

            LL cnt = 0;
            for(auto h : cand){
                int w = (n + h - 1) / h;
                int delta = w * h - n;
                if (w == h) cnt = (cnt + f[4][delta]) % mod;
                else cnt = (cnt + 2 * f[4][delta]) % mod;
            }
            cout << ans * 2 << ' ' << cnt << '\n';
        }
    }

}


Comments

Submit
0 Comments
More Questions

1271A - Suits
259B - Little Elephant and Magic Square
1389A - LCM Problem
778A - String Game
1382A - Common Subsequence
1512D - Corrupted Array
667B - Coat of Anticubism
284B - Cows and Poker Game
1666D - Deletive Editing
1433D - Districts Connection
2B - The least round way
1324A - Yet Another Tetris Problem
246B - Increase and Decrease
22E - Scheme
1566A - Median Maximization
1278A - Shuffle Hashing
1666F - Fancy Stack
1354A - Alarm Clock
1543B - Customising the Track
1337A - Ichihime and Triangle
1366A - Shovels and Swords
919A - Supermarket
630C - Lucky Numbers
1208B - Uniqueness
1384A - Common Prefixes
371A - K-Periodic Array
1542A - Odd Set
1567B - MEXor Mixup
669A - Little Artem and Presents
691B - s-palindrome